﻿using BO;
using CronosGlobal;
using JMI_Nfe.UI;
using JMI_Nucleo.Classe;
using JMI_Nucleo.View.Form_Util;
using Microsoft.VisualBasic;
using OR;
using OR.Enumerador;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Windows.Forms;

namespace CronosUtil
{
    public partial class FrmEmpresa : JMI_Nucleo.View.Form_Base.FrmBaseCadastro001
    {
        private List<mEndereco> lstEndereco = new List<mEndereco>();
        private mEndereco _mEndereco = null;
        private mEmpresa _mEmpresa = null;
        private Empresa empresa = null;
        private mCep _InfoCep;
        private bool _validaEndereco;
        private short registroEndereco;
        private bool sucesso;
        private string caminhoImagem = String.Empty;
        
        public FrmEmpresa()
        {
            InitializeComponent();

            Inicializa();
        }

        public bool ValidarEndereco { get { return _validaEndereco; } set { _validaEndereco = value; } }
    
        private void Inicializa()
        {
            empresa = new Empresa();
            _mEmpresa = new mEmpresa();

            caminhoImagem = String.Empty;
            registroEndereco = 0;            
            _mEmpresa.Codigo = 0;
            
            // Por enquanto esta fixo para teste
            CidadePadrao = "JABOTICABAL";
            UfPadrao = "SP";
            sucesso = false;

            rbResidencial.Checked = true;
            lblEndereco.Text = "Endereço:  0";
            _mEndereco = null;
            if (lstEndereco != null && lstEndereco.Count > 0)
                lstEndereco.Clear();

            // Desabilita somente os controle do grupo de endereço
            base.MudaControleRecursivo(gbEndereco.Controls, 2);
            this.BtnAdicionar.Enabled = true;
            TxtRazaoSocial.Focus();
        }        

        private void PopulaPropriedade()
        {
            JMIUtil jmiUtil = new JMIUtil();
         
            if (Acao == 'A') 
            { 
                _mEmpresa.Codigo = Convert.ToInt16(TxtCodigo.Text);
                _mEmpresa.DataAlteracao = DateTime.Today;
            }
            _mEmpresa.Pessoa.Nome = TxtRazaoSocial.Text;
            _mEmpresa.Pessoa.Apelido = TxtNomeFantasia.Text;
            _mEmpresa.Pessoa.CNPJ = jmiUtil.RemoveMascara(MskCnpj.Text);
            _mEmpresa.Pessoa.IE = jmiUtil.TrataInscEstadual(MskIE.Text);
            _mEmpresa.InscMunicipal = TxtInscMunicipal.Text;
            _mEmpresa.Contato.Telefone1 = TxtTelefone.Text;
            _mEmpresa.Contato.Telefone2 = TxtTelefone1.Text;
            _mEmpresa.Contato.Telefone3 = TxtTelefone2.Text;
            _mEmpresa.Contato.Fax = TxtFax.Text;
            _mEmpresa.Contato.Email1 = TxtEmail.Text;
            _mEmpresa.Contato.Email2 = TxtEmail1.Text;
            _mEmpresa.Contato.Site = TxtSite.Text;
            _mEmpresa.IBGE = TxtIbge.Text;
            _mEmpresa.RegimeSituacaoTributaria = chkRegimeTributario.CheckState == CheckState.Checked ? (short)1 : (short)0;
            _mEmpresa.Figura.Arquivo = caminhoImagem;
            _mEmpresa.Figura.Imagem = caminhoImagem;
            _mEmpresa.Figura.TabelaVinculada = "empresa";

            //FileInfo arqImagem = new FileInfo(caminhoImagem);
            //long tamanhoImagem = arqImagem.Length;
            //imagemByte = new byte[Convert.ToInt32(tamanhoImagem)];
            //FileStream fs = new FileStream(caminhoImagem, FileMode.Open, FileAccess.Read, FileShare.Read);
            //fs.Read(imagemByte, 0, Convert.ToInt32(tamanhoImagem));
            //fs.Close();

            _mEmpresa.Figura.ImgByte = jmiUtil.ConvertImageToByteArray(picLogo.Image, ImageFormat.Jpeg);

            if (_mEmpresa.ListaEndereco.Count > 0)
                _mEmpresa.ListaEndereco.Clear();
            foreach (var item in lstEndereco)
            {
                if (item.Tipo == eTipoEndereco.Residencial || item.Tipo == eTipoEndereco.Comercial)
                    _mEmpresa.UFInscEstadual = item.UF;
                _mEmpresa.ListaEndereco.AdicionaItem(item);
            }
        }

        private void PopulaComponente(mEmpresa obj)
        {
            JMIUtil objUtil = new JMIUtil();

            TxtCodigo.Text = obj.Codigo.ToString();
            TxtRazaoSocial.Text = obj.Pessoa.Nome;
            TxtNomeFantasia.Text = obj.Pessoa.Apelido;
            dtpDataCadastro.Value = obj.DataCadastro;
            MskCnpj.Text = obj.Pessoa.CNPJ;
            MskIE.Text = obj.Pessoa.IE;
            TxtInscMunicipal.Text = obj.InscMunicipal;
            TxtTelefone.Text = obj.Contato.Telefone1;
            TxtTelefone1.Text = obj.Contato.Telefone2;
            TxtTelefone2.Text = obj.Contato.Telefone3;
            TxtFax.Text = obj.Contato.Fax;
            TxtEmail.Text = obj.Contato.Email1;
            TxtEmail1.Text = obj.Contato.Email2;
            TxtSite.Text = obj.Contato.Site;
            TxtIbge.Text = obj.IBGE;
            chkRegimeTributario.CheckState = _mEmpresa.RegimeSituacaoTributaria == 1 ? CheckState.Checked : CheckState.Unchecked;
            TxtDataAlteracao.Text = objUtil.AjustaDataAlteracao(obj.DataAlteracao); 
            lstEndereco.Clear();
            foreach (var item in _mEmpresa.ListaEndereco)
            {
                lstEndereco.Add(item as mEndereco);
            }
            lblEndereco.Text = "Endereço: " + String.Format("{0:D2}", lstEndereco.Count);
            ExibeEndereco();

            //string imagemTemp = objUtil.GetCaminhoAplicacao();
            //imagemTemp += "empresa" + obj.Codigo.ToString() + ".jpeg";
            //if (File.Exists(imagemTemp))
            //{
            //    Image img = Image.FromFile(imagemTemp);
            //    picLogo.SizeMode = PictureBoxSizeMode.StretchImage;
            //    picLogo.Image = img;
            //}

            byte[] logo = _mEmpresa.Figura.ImgByte;
            if (logo.Length > 0)
            {
                Image img = objUtil.ConvertByteArrayToImage(logo);
                picLogo.SizeMode = PictureBoxSizeMode.StretchImage;
                picLogo.Image = img;
            }
        }

        private void BtnBuscaCEP_Click(object sender, EventArgs e)
        {
            FrmBuscaCep form = new FrmBuscaCep();
            form.ShowDialog();
            _InfoCep = form.InfoCep;
            if (_InfoCep != null)
            {
                CboTipoLogradouro.Text = _InfoCep.TipoLogradouro;
                TxtEndereco.Text = _InfoCep.Logradouro;
                MskCep.Text = _InfoCep.Cep;
                TxtBairro.Text = _InfoCep.Bairro;
                TxtCidade.Text = _InfoCep.Cidade;
                CboUF.Text = _InfoCep.UF;
                TxtNumero.Focus();
            }
        }        

        private void BtnAdImagem_Click(object sender, EventArgs e)
        {
            try
            {
                JMIUtil jmiUtil = new JMIUtil();
                openFileDialog1.Title = "Localizar Arquivos";
                openFileDialog1.Filter = "Arquivos de Imagem (*.jpeg)|*.jpeg|(*.jpg)|*.jpg";
                openFileDialog1.InitialDirectory = jmiUtil.GetCaminhoAplicacao(); 
                if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    caminhoImagem = openFileDialog1.FileName;
                    Image img = Image.FromFile(caminhoImagem);
                    picLogo.SizeMode = PictureBoxSizeMode.StretchImage;
                    picLogo.Image = img;
                }
            }
            catch (Exception ex)
            {
                // Não pode carregar a imagem (problemas de permissão)
                JMIMsg.MsgErro("Não é possível exibir a imagem : " + caminhoImagem.Substring(caminhoImagem.LastIndexOf('\\'))
                                            + ". Você pode não ter permissão para ler o arquivo , ou " +
                                            " ele pode estar corrompido.\n\nErro reportado : " + ex.Message);
            }
        }

        private void BtnRevImagem_Click(object sender, EventArgs e)
        {
            picLogo.Image = null;
        }

        private void BtnBuscaIbge_Click(object sender, EventArgs e)
        {
            FrmConIBGESQLite form = new FrmConIBGESQLite();
            form.lblTitulo.Text = "Consulta de Códigos do I.B.G.E";
            form.ShowDialog();
            TxtIbge.Text = form.NumeroIBGE.ToString();
        }

        private void FrmEmpresa_Load(object sender, EventArgs e)
        {
            tbControle.SelectTab(0);   
            base.MudaControleRecursivo(this.Controls,2);
            gbIbge.Enabled = false;
            gbLogo.Enabled = false;
        }
       
        private void BtnIncluir_Click(object sender, EventArgs e)
        {
            Inicializa();
            gbIbge.Enabled = true;
            gbLogo.Enabled = true;
        }

        private void TxtComplemento_Leave(object sender, EventArgs e)
        {
            if (BtnSalvar.Enabled)
                BtnSalvar.Focus();
        }

        private bool ValidaEndereco()
        {
            bool retorno = true;
            TxtStatus.Text = String.Empty;
            string cep = String.Empty;
            string cepFormatado = String.Empty;
            string uf = String.Empty;
            JMIUtil objUtil = new JMIUtil();

            TrocaIconeAviso(1);

            if (String.IsNullOrEmpty(CboTipoLogradouro.Text))
            {
                TxtStatus.Text = "Tipo de Endereço, Campo Obrigatório.";
                TrocaIconeAviso(2);
                retorno = false;
            }
            else if (String.IsNullOrEmpty(TxtEndereco.Text))
            {
                TxtStatus.Text = "Logradouro, Campo Obrigatório.";
                TrocaIconeAviso(2);
                retorno = false;
            }
            else if (String.IsNullOrEmpty(TxtNumero.Text))
            {
                TxtStatus.Text = "Número, Campo Obrigatório.";
                TrocaIconeAviso(2);
                retorno = false;
            }
            cep = MskCep.Text;
            if (String.IsNullOrEmpty(cep))
            {
                TxtStatus.Text = "Cep, Campo Obrigatório.";
                TrocaIconeAviso(2);
                retorno = false;
            }
            else
            {
                if (!objUtil.isValidaCep(cep, ref cepFormatado))
                {
                    TxtStatus.Text = "Cep inválido.";
                    TrocaIconeAviso(2);
                    retorno = false;
                }
            }
            if (String.IsNullOrEmpty(TxtBairro.Text))
            {
                TxtStatus.Text = "Bairro, Campo Obrigatório.";
                TrocaIconeAviso(2);
                retorno = false;
            }
            else if (String.IsNullOrEmpty(TxtCidade.Text))
            {
                TxtStatus.Text = "Cidade, Campo Obrigatório.";
                TrocaIconeAviso(2);
                retorno = false;
            }
            uf = CboUF.Text;
            if (String.IsNullOrEmpty(uf))
            {
                TxtStatus.Text = "UF, Campo Obrigatório.";
                TrocaIconeAviso(2);
                retorno = false;
            }
            else
            {
                if (!objUtil.isValidaUF(uf))
                {
                    TxtStatus.Text = "UF inválido.";
                    TrocaIconeAviso(2);
                    retorno = false;
                }
            }
            return retorno;
        }

        private void ExibeEndereco()
        {
            if (lstEndereco.Count > 0)
            {
                _mEndereco = lstEndereco[registroEndereco];
                if (_mEndereco != null)
                {
                    CboTipoLogradouro.Text = _mEndereco.TipoLogradouro;
                    TxtEndereco.Text = _mEndereco.Logradouro;
                    TxtNumero.Text = _mEndereco.Numero;
                    MskCep.Text = _mEndereco.Cep;
                    TxtBairro.Text = _mEndereco.Bairro;
                    TxtCidade.Text = _mEndereco.Cidade;
                    CboUF.Text = _mEndereco.UF;
                    TxtComplemento.Text = _mEndereco.Complemento;

                    switch (_mEndereco.Tipo)
                    {
                        case eTipoEndereco.Residencial:
                            rbResidencial.Checked = true;
                            break;
                        case eTipoEndereco.Correspondencia:
                            rbCorrespondencia.Checked = true;
                            break;
                        case eTipoEndereco.Comercial:
                            rbComercial.Checked = true;
                            break;
                        case eTipoEndereco.Cobranca:
                            rbCobranca.Checked = true;
                            break;
                    }
                }
            }
        }

        private void BtnAdicionar_Click(object sender, EventArgs e)
        {
            base.MudaControleRecursivo(gbEndereco.Controls, 1);
            if (_mEndereco != null)
                _mEndereco = null;
            rbResidencial.Checked = true;
            TxtStatus.Text = String.Empty;
            TrocaIconeAviso(1);
            CboTipoLogradouro.Text = String.Empty;
            TxtEndereco.Text = String.Empty;
            TxtNumero.Text = String.Empty;
            MskCep.Text = String.Empty;
            TxtBairro.Text = String.Empty;
            TxtCidade.Text = CidadePadrao;
            CboUF.Text = UfPadrao;
            TxtComplemento.Text = String.Empty;
            
            CboTipoLogradouro.Focus();
        }

        private void BtnSalvarEndereco_Click(object sender, EventArgs e)
        {
            bool enderecoValido = true;
            JMIUtil objUtil = new JMIUtil();
          
            if (ValidarEndereco)
                enderecoValido = ValidaEndereco();
            if (enderecoValido)
            {
                if (_mEndereco == null)
                    _mEndereco = new mEndereco();
                _mEndereco.TipoLogradouro = CboTipoLogradouro.Text;
                _mEndereco.Logradouro = TxtEndereco.Text;
                _mEndereco.Numero = TxtNumero.Text;
                _mEndereco.Cep = objUtil.RemoveMascara(MskCep.Text);
                _mEndereco.Bairro = TxtBairro.Text;
                _mEndereco.Cidade = TxtCidade.Text;
                _mEndereco.UF = CboUF.Text;
                _mEndereco.Complemento = TxtComplemento.Text;
                if (rbResidencial.Checked)
                    _mEndereco.Tipo = eTipoEndereco.Residencial;
                else if (rbCorrespondencia.Checked)
                    _mEndereco.Tipo = eTipoEndereco.Correspondencia;
                else if (rbComercial.Checked)
                    _mEndereco.Tipo = eTipoEndereco.Comercial;
                else if (rbCobranca.Checked)
                    _mEndereco.Tipo = eTipoEndereco.Cobranca;
            }

            TrocaIconeAviso(1);
            TxtStatus.Text = String.Empty;

            if (_mEndereco != null)
            {
                // Verifica se o tipo de endereço ja existe na lista
                if (lstEndereco.Count > 1)
                    foreach (var item in lstEndereco)
                    {
                        if (item.Tipo == _mEndereco.Tipo)
                        {
                            TrocaIconeAviso(2);
                            TxtStatus.Text = "Já existe este tipo de endereço na lista, selecione outro.";
                            enderecoValido = false;
                            break;
                        }
                    }
                if (enderecoValido == false)
                    return;
                lstEndereco.Add(_mEndereco);
                lblEndereco.Text = "Endereço: " + String.Format("{0:D2}", lstEndereco.Count);
                registroEndereco = (short)lstEndereco.Count;
            }
            else
            {
                TrocaIconeAviso(2);              
                TxtStatus.Text = "Clique no botão inserir para criar um novo endereço.";
            }
        }

        private void BtnRemover_Click(object sender, EventArgs e)
        {
            if (lstEndereco.Count > 0)
            {
                lstEndereco.RemoveAt(registroEndereco);
                registroEndereco = 0;
                BtnAnterior.Enabled = false;
                lblEndereco.Text = "Endereço: " + String.Format("{0:D2}", lstEndereco.Count);

                base.MudaControleRecursivo(gbEndereco.Controls, 2);
                this.BtnAdicionar.Enabled = true;
            }
        }

        private void BtnLimpar_Click(object sender, EventArgs e)
        {
            _mEndereco = null;
            caminhoImagem = String.Empty;
            lblEndereco.Text = "Endereço:  0";
            if (lstEndereco != null && lstEndereco.Count > 0)
                lstEndereco.Clear();
            picLogo.Image = null;
            lstEndereco.Clear();
        }

        private void BtnAnterior_Click(object sender, EventArgs e)
        {
            if (registroEndereco > 0)
            {
                BtnProximo.Enabled = true;
                registroEndereco--;
                ExibeEndereco();
            }
            else
                BtnAnterior.Enabled = false;
        }

        private void BtnProximo_Click(object sender, EventArgs e)
        {
            if (registroEndereco < lstEndereco.Count - 1)
            {
                BtnAnterior.Enabled = true;
                registroEndereco++;
                ExibeEndereco();
            }
            else
                BtnProximo.Enabled = false; 
        }

        private void BtnBuscaPorCodigo_Click(object sender, EventArgs e)
        {
            string retorno = Interaction.InputBox("Informe o código para pesquisa","Pesquisa por Código");

            if (!String.IsNullOrEmpty(retorno))
            {
                _mEmpresa = empresa.GetEmpresa(Convert.ToInt32(retorno));
                if (_mEmpresa != null)
                {
                    PopulaComponente(_mEmpresa);
                    base.Pesquisar();
                }
            }
        }

        private void BtnAlterar_Click(object sender, EventArgs e)
        {
            gbIbge.Enabled = true;
            gbLogo.Enabled = true;
        }

        private void BtnSalvar_Click(object sender, EventArgs e)
        {
            TxtStatus.Text = String.Empty;
            TrocaIconeAviso(1);
            if (lstEndereco.Count == 0)
            {
                TxtStatus.Text = "Não foi informado nenhum endereço para este cadastro.";
                TrocaIconeAviso(2);
            }
            else
            {
                PopulaPropriedade();
                sucesso = empresa.Salvar(_mEmpresa, Acao, _mEmpresa.Codigo);
                if (sucesso)
                {
                    base.MudaControleRecursivo(this.Controls, 2);
                    tbControle.SelectedTab = tbPrincipal;
                    base.Limpar(this.Controls);
                    TxtStatus.Text = "Dados gravados com sucesso ...";
                    base.Salvar();                    
                }
                else
                {
                    if (!String.IsNullOrEmpty(empresa.MsgErro))
                    {
                        TrocaIconeAviso(2);
                        TxtStatus.Text = empresa.MsgErro;
                    }
                    base.Salvar(false);
                    base.MudaControleRecursivo(this.Controls, 1);
                    TxtRazaoSocial.Focus();
                }
            }
        }

        private void BtnPesquisa_Click(object sender, EventArgs e)
        {
            FrmConEmpresa formConsulta = new FrmConEmpresa();
            formConsulta.Titulo = "Consulta de Empresas";
            formConsulta.ShowDialog();

            if (formConsulta.CampoRetorno > 0)
            {
                _mEmpresa = empresa.GetEmpresa(formConsulta.CampoRetorno);
                if (_mEmpresa != null)
                {
                    PopulaComponente(_mEmpresa);
                    base.Pesquisar();
                }
            }
        }

        private void MskIE_Enter(object sender, EventArgs e)
        {
            MskIE.Mask = String.Empty;
        }

        private void MskIE_Leave(object sender, EventArgs e)
        {
            JMIUtil objUtil = new JMIUtil();
            string s = MskIE.Text;
            if (!String.IsNullOrEmpty(s))
            {
                if (objUtil.ContemNumero(s) && s.Length == 12)
                    MskIE.Mask = @"999\.999\.999\.999";
            }
        }

        private void TxtInscMunicipal_KeyPress(object sender, KeyPressEventArgs e)
        {
            //if (!char.IsDigit(e.KeyChar) && e.KeyChar != (char)8)
            //    e.Handled = true;
        }

        private void TxtTelefone_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!char.IsDigit(e.KeyChar) && e.KeyChar != (char)8 && 
                e.KeyChar != (char)40 && e.KeyChar != (char)41 &&
                e.KeyChar != (char)45 && e.KeyChar != (char)32)
                e.Handled = true;
        }

        private void BtnPesqCNPJ_Click(object sender, EventArgs e)
        {
            string sCNPJ = MskCnpj.Text;
            if (!String.IsNullOrEmpty(sCNPJ))
            {
                _mEmpresa = empresa.GetEmpresaPorCNPJ(sCNPJ);
                if (_mEmpresa != null)
                {
                    PopulaComponente(_mEmpresa);
                    base.Pesquisar();
                }
            }
        }

        private void BtnConfirma_Click(object sender, EventArgs e)
        {
            sucesso = empresa.Excluir(_mEmpresa);
            if (sucesso)
            {
                base.MudaControleRecursivo(this.Controls, 2);
                tbControle.SelectedTab = tbPrincipal;
                base.Limpar(this.Controls);
                TxtStatus.Text = "Dados excluidos com sucesso ...";
                base.Salvar();
            }
        }

        private void BtnFechar_Click(object sender, EventArgs e)
        {
            bool cadastroEfetuado = empresa.ExisteCadastro();

            if (cadastroEfetuado == false)
            {
                JMIMsg.MsgInformacao("Não existe empresa cadastra ainda. O sistema será encerrado.");
                Global.GetInstance().EncerraAplicacao = true;
                Application.Exit();
            }
        }                       
    }
}
